package cluster

import (
	"fmt"
	"log"
	"path/filepath"
	"strings"
)

// InstallSealos 解压并安装sealos二进制文件
func (m *Manager) InstallSealos() {
	files, err := filepath.Glob("sealos*")
	if err != nil {
		log.Fatalf("查找文件失败: %v", err)
	}
	if len(files) == 0 {
		log.Fatal("未找到 sealos 相关文件")
	}

	targetFile := files[0]
	log.Printf("将解压文件: %s", targetFile)

	// 使用新的 runCommand 函数执行命令
	if err := m.executor.RunCommand("tar", "zxvf", targetFile, "sealos"); err != nil {
		log.Fatalf("解压失败: %v", err)
	}

	if err := m.executor.RunCommand("chmod", "+x", "sealos"); err != nil {
		log.Fatalf("修改权限失败: %v", err)
	}

	if err := m.executor.RunCommand("mv", "sealos", "/usr/bin"); err != nil {
		log.Fatalf("移动文件失败: %v", err)
	}

	log.Println("安装完成")
}

// ImportK8sTar 导入kubernetes的离线包
func (m *Manager) ImportK8sTar() {
	if err := m.executor.RunCommand("sealos", "load", "-i", "k8s-offline.tar"); err != nil {
		log.Fatalf("导入离线包失败: %v", err)
	}
	log.Println("导入离线包成功")
}

// InitK8sCluster 初始化kubernetes集群
func (m *Manager) InitK8sCluster() {
	// 从环境变量配置中获取所有需要创建的目录
	dirs := []string{
		m.env["SEALOS_RUNTIME_ROOT"],
		m.env["SEALOS_DATA_ROOT"],
		filepath.Dir(m.env["CONTAINERS_STORAGE_CONF"]),
		m.env["CONTAINER_RUNROOT"],
		m.env["CONTAINER_GRAPHROOT"],
	}

	// 创建所有必要的目录
	for _, dir := range dirs {
		if err := m.executor.RunCommand("mkdir", "-p", dir); err != nil {
			log.Fatalf("创建目录 %s 失败: %v", dir, err)
		}
	}

	// 配置 containers storage
	storageConf := fmt.Sprintf(`[storage]
driver = "overlay"
runroot = "%s"
graphroot = "%s"
`, m.env["CONTAINER_RUNROOT"], m.env["CONTAINER_GRAPHROOT"])

	if err := m.executor.RunCommand("bash", "-c", fmt.Sprintf("echo '%s' > %s", storageConf, m.env["CONTAINERS_STORAGE_CONF"])); err != nil {
		log.Fatalf("写入存储配置失败: %v", err)
	}

	// 构建命令参数
	args := []string{"run"}
	args = append(args, m.cfg.Cluster.Image...)
	args = append(args, "--masters", strings.Join(m.cfg.Cluster.Masters, ","))
	if len(m.cfg.Cluster.Nodes) > 0 {
		args = append(args, "--nodes", strings.Join(m.cfg.Cluster.Nodes, ","))
	}
	args = append(args, "-p", m.cfg.Cluster.Password)

	// 添加环境变量配置
	for key, value := range m.env {
		args = append(args, fmt.Sprintf("-e %s=%s", key, value))
	}

	if err := m.executor.RunCommand("sealos", args...); err != nil {
		log.Fatalf("执行集群安装失败: %v", err)
	}
	log.Println("集群初始化完成")
}
